Learn in 10 minutes

Learn in 10 minutes

Apprendre le C en 10 minutes

Le C est un langage de programmation puissant et polyvalent, connu pour son efficacité et ses capacités proches du matériel. Ce tutoriel couvre les fondamentaux de la programmation en C, vous aidant à comprendre rapidement le langage.

1. Écrire votre premier programme en C

Commençons par le classique programme “Hello, World!”. Créez un fichier nommé hello.c et entrez le code suivant :

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Sauvegardez le fichier et compilez-le en utilisant un compilateur C comme GCC :

gcc hello.c -o hello
./hello

La sortie sera :

Hello, World!

Ce programme simple démontre la structure de base du C :

  • #include <stdio.h> inclut la bibliothèque d’entrée/sortie standard
  • int main() est le point d’entrée du programme
  • printf() affiche la sortie texte
  • return 0 indique une exécution réussie

2. Syntaxe de base

Le C utilise une syntaxe structurée avec des points-virgules pour terminer les instructions et des accolades {} pour définir les blocs de code.

// Ceci est un commentaire sur une seule ligne
/* Ceci est un commentaire multi-lignes */

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Règles de syntaxe de base en C :

  • Points-virgules : Chaque instruction doit se terminer par un point-virgule ;
  • Commentaires : Les commentaires sur une ligne utilisent //, les commentaires multi-lignes utilisent /* */
  • Blocs de code : Définis par des accolades {}
  • Sensibilité à la casse : Le C est sensible à la casse (main vs Main)

3. Variables et types de données

Le C est un langage typé statiquement, ce qui signifie que vous devez déclarer les types de variables avant de les utiliser.

Règles de base pour nommer les variables :

  • Les noms de variables peuvent contenir des lettres, des chiffres et des underscores
  • Les noms de variables ne peuvent pas commencer par un chiffre
  • Les noms de variables sont sensibles à la casse
  • Les mots-clés du C ne peuvent pas être utilisés comme noms de variables

Principaux types de données en C :

  • int : Nombres entiers (ex. 42, -10)
  • float : Nombres à virgule flottante (ex. 3.14, -2.5)
  • double : Nombres à virgule flottante double précision
  • char : Caractères uniques (ex. 'A', 'z')
  • void : Aucun type
int age = 25;
float temperature = 36.5;
double pi = 3.14159265359;
char grade = 'A';

3.1 Types entiers

Le C fournit plusieurs types entiers avec différentes tailles :

char small_number = 100;        // Généralement 1 octet
short medium_number = 32000;    // Généralement 2 octets
int regular_number = 1000000;   // Généralement 4 octets
long large_number = 1000000000; // Généralement 4 ou 8 octets

3.2 Types à virgule flottante

float single_precision = 3.14f;
double double_precision = 3.14159265359;
long double extended_precision = 3.14159265358979323846L;

3.3 Type caractère

Les caractères sont stockés comme des entiers en utilisant l’encodage ASCII :

char letter = 'A';
char digit = '7';
char newline = '\n';
char tab = '\t';

4. Constantes

Les constantes sont des valeurs fixes qui ne peuvent pas être modifiées pendant l’exécution du programme :

const int MAX_SIZE = 100;
const float PI = 3.14159;
const char NEWLINE = '\n';

#define MAX_USERS 1000
#define PI 3.14159

5. Entrée et sortie

Le C utilise des fonctions de stdio.h pour les opérations d’entrée et de sortie.

5.1 Sortie avec printf()

#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75;
    char name[] = "John";

    printf("Hello, %s!\n", name);
    printf("You are %d years old\n", age);
    printf("Your height is %.2f meters\n", height);

    return 0;
}

Spécificateurs de format courants :

  • %d - entier
  • %f - float/double
  • %c - caractère
  • %s - chaîne de caractères
  • %p - pointeur

5.2 Entrée avec scanf()

#include <stdio.h>

int main() {
    int age;
    float height;
    char name[50];

    printf("Enter your name: ");
    scanf("%s", name);

    printf("Enter your age: ");
    scanf("%d", &age);

    printf("Enter your height: ");
    scanf("%f", &height);

    printf("Hello %s, you are %d years old and %.2f meters tall\n",
           name, age, height);

    return 0;
}

6. Opérateurs

Le C fournit un riche ensemble d’opérateurs pour divers calculs.

6.1 Opérateurs arithmétiques

int a = 10, b = 3;

printf("Addition: %d\n", a + b);      // 13
printf("Subtraction: %d\n", a - b);   // 7
printf("Multiplication: %d\n", a * b); // 30
printf("Division: %d\n", a / b);      // 3
printf("Modulus: %d\n", a % b);       // 1

6.2 Opérateurs de comparaison

int x = 5, y = 10;

printf("Equal: %d\n", x == y);     // 0 (false)
printf("Not equal: %d\n", x != y); // 1 (true)
printf("Greater than: %d\n", x > y);  // 0
printf("Less than: %d\n", x < y);  // 1

6.3 Opérateurs logiques

int a = 1, b = 0;

printf("AND: %d\n", a && b);  // 0
printf("OR: %d\n", a || b);   // 1
printf("NOT: %d\n", !a);      // 0

6.4 Opérateurs bit à bit

unsigned int a = 5;  // 0101 en binaire
unsigned int b = 3;  // 0011 en binaire

printf("AND: %d\n", a & b);   // 1 (0001)
printf("OR: %d\n", a | b);    // 7 (0111)
printf("XOR: %d\n", a ^ b);   // 6 (0110)
printf("NOT: %d\n", ~a);      // dépend du système
printf("Left shift: %d\n", a << 1);  // 10 (1010)
printf("Right shift: %d\n", a >> 1); // 2 (0010)

7. Contrôle de flux

Le C fournit plusieurs instructions de contrôle de flux pour gérer l’exécution du programme.

7.1 Instructions if

int age = 20;

if (age >= 18) {
    printf("Adult\n");
} else if (age >= 13) {
    printf("Teen\n");
} else {
    printf("Child\n");
}

7.2 Instructions switch

int day = 3;

switch (day) {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    default:
        printf("Other day\n");
}

7.3 Boucles for

for (int i = 0; i < 5; i++) {
    printf("i = %d\n", i);
}

7.4 Boucles while

int count = 0;
while (count < 5) {
    printf("Count: %d\n", count);
    count++;
}

7.5 Boucles do-while

int count = 0;
do {
    printf("Count: %d\n", count);
    count++;
} while (count < 5);

7.6 break et continue

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;  // Quitter la boucle
    }
    if (i % 2 == 0) {
        continue;  // Sauter les nombres pairs
    }
    printf("i = %d\n", i);  // Sortie : 1, 3
}

8. Tableaux

Les tableaux stockent plusieurs valeurs du même type.

8.1 Tableaux unidimensionnels

int numbers[5] = {1, 2, 3, 4, 5};

// Accès aux éléments
printf("First element: %d\n", numbers[0]);
printf("Last element: %d\n", numbers[4]);

// Modification des éléments
numbers[0] = 10;

// Parcours du tableau
for (int i = 0; i < 5; i++) {
    printf("numbers[%d] = %d\n", i, numbers[i]);
}

8.2 Tableaux multidimensionnels

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

// Accès aux éléments
printf("matrix[1][2] = %d\n", matrix[1][2]);  // 6

// Parcours du tableau 2D
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}

9. Chaînes de caractères

En C, les chaînes de caractères sont des tableaux de caractères terminés par un caractère nul \0.

char greeting[] = "Hello";  // Inclut automatiquement le terminateur nul
char name[20] = "John";

// Fonctions de chaîne de string.h
#include <string.h>

char str1[20] = "Hello";
char str2[20] = "World";

printf("Length: %lu\n", strlen(str1));  // 5
strcpy(str1, str2);  // Copier str2 vers str1
printf("After copy: %s\n", str1);  // World

if (strcmp(str1, str2) == 0) {
    printf("Strings are equal\n");
}

10. Fonctions

Les fonctions sont des blocs de code réutilisables qui effectuent des tâches spécifiques.

10.1 Définition et appel de fonctions

#include <stdio.h>

// Déclaration de fonction
int add(int a, int b);

int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    return 0;
}

// Définition de fonction
int add(int a, int b) {
    return a + b;
}

10.2 Fonction sans valeur de retour

void greet(char name[]) {
    printf("Hello, %s!\n", name);
}

int main() {
    greet("Alice");
    return 0;
}

10.3 Fonctions récursives

int factorial(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main() {
    printf("5! = %d\n", factorial(5));  // 120
    return 0;
}

11. Pointeurs

Les pointeurs sont des variables qui stockent des adresses mémoire.

11.1 Utilisation basique des pointeurs

int number = 42;
int *ptr = &number;  // ptr stocke l'adresse de number

printf("Value: %d\n", number);     // 42
printf("Address: %p\n", &number);  // Adresse mémoire
printf("Pointer value: %d\n", *ptr); // 42 (déréférencement)

// Modification de la valeur via le pointeur
*ptr = 100;
printf("New value: %d\n", number);  // 100

11.2 Pointeurs et tableaux

int numbers[] = {1, 2, 3, 4, 5};
int *ptr = numbers;  // pointe vers le premier élément

printf("First element: %d\n", *ptr);        // 1
printf("Second element: %d\n", *(ptr + 1)); // 2

// Le nom du tableau est essentiellement un pointeur vers le premier élément
for (int i = 0; i < 5; i++) {
    printf("numbers[%d] = %d\n", i, *(numbers + i));
}

11.3 Pointeurs et fonctions

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("Before swap: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("After swap: x=%d, y=%d\n", x, y);
    return 0;
}

12. Structures

Les structures vous permettent de regrouper des variables liées ensemble.

12.1 Définition et utilisation des structures

#include <stdio.h>
#include <string.h>

// Définition de structure
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // Création de variables de structure
    struct Student student1;

    // Attribution de valeurs
    strcpy(student1.name, "Alice");
    student1.age = 20;
    student1.gpa = 3.8;

    // Accès aux membres de la structure
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

12.2 Structures avec pointeurs

struct Point {
    int x;
    int y;
};

int main() {
    struct Point p1 = {10, 20};
    struct Point *ptr = &p1;

    printf("Coordinates: (%d, %d)\n", ptr->x, ptr->y);

    return 0;
}

13. Allocation dynamique de mémoire

Le C fournit des fonctions pour la gestion dynamique de la mémoire.

13.1 malloc, calloc, realloc, free

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Allouer de la mémoire pour 5 entiers
    int *numbers = (int*)malloc(5 * sizeof(int));

    if (numbers == NULL) {
        printf("Memory allocation failed!\n");
    return 1;
    }

    // Initialiser le tableau
    for (int i = 0; i < 5; i++) {
        numbers[i] = i * 10;
    }

    // Afficher le tableau
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }

    // Libérer la mémoire allouée
    free(numbers);

    return 0;
}

13.2 Allocation dynamique de chaînes

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *name = (char*)malloc(50 * sizeof(char));

    if (name != NULL) {
        strcpy(name, "Dynamic string");
        printf("Name: %s\n", name);
        free(name);
    }

    return 0;
}

14. Opérations sur les fichiers

Le C fournit des fonctions pour lire et écrire dans des fichiers.

14.1 Écriture dans un fichier

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");

    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fprintf(file, "Hello, File!\n");
    fprintf(file, "This is a test.\n");

    fclose(file);
    printf("File written successfully.\n");

    return 0;
}

14.2 Lecture d’un fichier

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    char buffer[100];

    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    fclose(file);

    return 0;
}

15. Directives du préprocesseur

Les directives du préprocesseur sont traitées avant la compilation.

15.1 #include

#include <stdio.h>    // Fichier d'en-tête système
#include "myheader.h" // Fichier d'en-tête utilisateur

15.2 #define

#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    double area = PI * 5 * 5;
    int larger = MAX(10, 20);

    printf("Area: %.2f\n", area);
    printf("Larger number: %d\n", larger);

    return 0;
}

15.3 Compilation conditionnelle

#define DEBUG 1

int main() {
    #ifdef DEBUG
        printf("Debug mode enabled\n");
    #endif

    #if DEBUG == 1
        printf("Debug level 1\n");
    #elif DEBUG == 2
        printf("Debug level 2\n");
    #else
        printf("No debug\n");
    #endif

    return 0;
}

16. Gestion des erreurs

Le C n’a pas de gestion d’exceptions intégrée, donc nous utilisons des valeurs de retour et des codes d’erreur.

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
        return 1;
    }

    fclose(file);
    return 0;
}

Ce tutoriel complet sur le C couvre les concepts essentiels dont vous avez besoin pour commencer à programmer en C. Pratiquez ces exemples et explorez des sujets plus avancés comme les listes chaînées, les pointeurs de fonctions et les programmes multi-fichiers au fur et à mesure que vous vous familiarisez avec le langage.